iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
自我挑戰組

[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ系列 第 23

[LeetCode with JavaScript] Day 23: Hamming Distance

  • 分享至 

  • xImage
  •  

觀前提醒:

  1. 我預設大家已經先思考並分析過題目,沒啥想法才開始 google 找解題靈感。若無,建議每題先花 1~2 顆番茄鐘的時間來分析題目比較好。可參考番茄鐘工作法
  2. 承上,既然已經有思考過了,那我這邊直接 po 題目 + 解題想法 + code +心得 。若已經在 code 內有足夠的註解了,那我可能解題想法 & 心得的部分就不會寫太多,免得干擾你的思考。
  3. 所有解法都是已經取得系統的 Accepted,但或許不是最優解法,請多包涵。
  4. 若對於解法不太懂,可以嘗試用 Chrome 的 debugger 來試跑看看 (教學文)
  5. 最後,歡迎在下面留言指教~教學相長才會進步歐~/images/emoticon/emoticon41.gif

題目

The Hamming distance between two integers is the number of positions at which the corresponding bits are different.

Given two integers x and y, calculate the Hamming distance.

Note:

  • 0 ≤ x, y < 2^31.

Example:

Input: x = 1, y = 4

Output: 2

Explanation:
1   (0 0 0 1)
4   (0 1 0 0)
       ↑   ↑

The above arrows point to positions where the corresponding bits are different.

解題想法

簡單說,這題的想法,我是在維基百科裡面,關於 Hamming distance 的 Algorithm example ,看到一線曙光。/images/emoticon/emoticon01.gif
他在裡面提到下面這段:

It computes the bitwise exclusive or of the two inputs, and then finds the Hamming weight of the result (the number of nonzero bits) using an algorithm of Wegner (1960) that repeatedly finds and clears the lowest-order nonzero bit.

那問題來了,什麼是 Hamming weight(漢明重量) 呢? 他跟我們題目的 Hamming Distance 差別在哪?
殊不知中文版的漢明距離開頭,就提供了非常棒的解答~

  • 在資訊理論中,兩個等長字符串之間的漢明距離(英語:Hamming distance)是兩個字符串對應位置的不同字符的個數。換句話說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數。
  • 漢明重量是字符串相對於同樣長度的零字符串的漢明距離,也就是說,它是字符串中非零的元素個數:對於二進位字符串來說,就是1的個數,所以11101的漢明重量是4。

綜上所述,只需採取以下兩步驟即可求解

  1. 先把 x 與 y 做 Bitwise operation-XOR 的計算,並把結果存起來。
  2. 再來計算結果中,出現 1 的個數。

CODE

/**
 * @param {number} x
 * @param {number} y
 * @return {number}
 */
var hammingDistance = function (x, y) {
  let arrOfXXorY = (x ^ y).toString(2).split("");
  let hamDis = 0;
  for (i = 0; i < arrOfXXorY.length; i++) {
    if (arrOfXXorY[i] === "1") {
      hamDis++;
    }
  }
  return hamDis;
};

心得

我只能說,遇到 CS 領域中的基礎理論題目,維基百科真的是大家的好朋友/images/emoticon/emoticon37.gif


謝謝大家的收看,LeetCode 小學堂我們下次見~/images/emoticon/emoticon29.gif


上一篇
[LeetCode with JavaScript] Day 22: Power of Three
下一篇
[LeetCode with JavaScript] Day 24: Best Time to Buy and Sell Stock
系列文
[LeetCode with JavaScript] 一起來刷 LeetCode吧 ~~~ (ノ>ω<)ノ30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言